<?
	class checker
	{
		//проверяет строку на запрещённые символы
		function check_forbid($string)
		{
			//!!!!
			//здесь нужно сделать проверку строки на запрещённые html символы (управляющие итп)
			return true;

		}
	}

//---------------------------------------------------------------------------------------------------
	//класс занимается загрузкой перевода и выдаёт строки перевода по запросу
	class translator extends checker //наследуется проверка строки на запрещённые символы
	{
		var $nom=array();
		var $rus=array();
		var $de=array();
		var $default_language;
		public function load_transl($source, $transl_type)
		{
			if (isset($debug)) echo ("<br>вызывана функция load_transl c ключами ".$source." ".$transl_type."<br>");
			checker::check_forbid($source);
			$transl_arr=file($source);//файл целицом подгружается в массив. Каждый элемент массива - строка
			if (!$transl_arr)
			{
				echo("проблема с открытием $source");
				exit();
			}
			$i=0;
			while ($element=each($transl_arr))
			{
				if ($transl_type=="artikul")	list ($this->nom[$i], $this->rus[$i], $this->de[$i])=explode("\t", $element[1]);
				elseif ($transl_type=="main")list ($this->de[$i], $this->rus[$i])=explode("\t", $element[1]);
				else
				{
					echo ("Неверный аргумент $transl_type при вызове функции load_transl()");
					exit();
				}
				$i++;
			}			
		}
		//установка языка по умолчанию
		function set_lang($string)
		{
			switch ($string)
			{
				case "DE":
					$this->default_language="DE";
					break;
				case "RUS":
					$this->default_language="RUS";
					break;
				default:
					echo ("Проблема вызова set_lang");
					break;
			}
		}
		function translate($string)
		{
			//проверим, есть ли загруженный перевод	
			if (sizeof($this->rus)==0)
			{
				echo("Проблема вызова функции перевода - не подгрузился перевод");
				exit();
			}
			for ($i=0; $i<sizeof($this->rus); $i++) //для всех строчек словаря
			{
//				echo ("сравнение .".$string.". И .".trim($this->rus[$i]).".<br>");
				if (trim($this->rus[$i]) == trim($string))  //есди указанная строка совпадёт со строкой перевода
				{
					if ($this->default_language=="RUS") return trim($this->rus[$i]);//то прекращаем поиск и возвращаем перевод на нужном языке
					if ($this->default_language=="DE") return trim($this->de[$i]);
				}
			}
			return $string."(!)";				//перевод не нашёлся
		}
		//функция переводит все строчки массива
		function translate_string($strarr)
		{
			$result=array();

			foreach($strarr as $str)
			{
				array_push($result,$this->translate($str));
			}
			return $result;
		}
		function translator($lang,$file1, $type1) //конструктор для класса перевода. При создании класса задаётся язык по умолчанию и загружается файл со словарём.
		{
			$this->set_lang($lang);
			if (isset($file1) && isset($type1)) $this->load_transl($file1, $type1);//выполняется лишь в том случае, когда последние два параметра указаны при вызове конструктора
		}
	}
	
//---------------------------------------------------------------------------------------------------
	class mypage extends checker
	{
		var $splitted_transl;
		var $title;//заголовок страницы
		//устанавливает переменную $title
		function set_title($title)
		{
			if ($this->check_forbid($title)) $this->title=$title; //установка $title, если он пройдёт проверку на запрещённые символы
			else echo("не вышло установить заголовок");

		}
		private function draw_title()
		{		
			if (!empty($this->title)) 
			{
//				$translated_title=$translator.translate($this->title);
//реализовать не вышло, т.к. экземпляр translator отсюда не доступен. идём напрямую
				echo ('<title>'.$this->title.'</title>');
			}
			else 
			{
				echo("Заголовок страницы не задан");//если заголовок не задан, выход из сценария
				exit();
			}
		}
		//добавляет в документ head и устанавливет кодировку
		function draw_header()
		{
			echo("<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8'/>\n");
			$this->draw_title();//выведем титл, если он задан. иначе - стоп
			echo ("</head>\n");			
		}
		//конструктор. Выполняется при создании объекта
		function mypage() 
		{
			echo("<script language='javascript' src='dynaddline.js'></script>\n");//скрипт для динамического добавления строчек
			echo("<script language='javascript' src='matematika.js'></script>\n");//ява-скрипт для динамической проверки введённых данных
		}
		function get_artikul($fname)
		{
//			require_once('artikul.php'); //загрузка артикулов при необходимости
		}
		function shapka($zagol, $inparr, $otkuda)
		{
			//$otkuda - управляющая строка, отвечающая за последовательность отображения строк из $zagol и $inparr
			reset($zagol);//массив с названиями таблицы
			reset($inparr);//класс с параметрами инпутов

//			echo('<form method="post">');
			echo('<span id="shapka1">');
			echo("<table>\n");
			if (sizeof($zagol)==0)
			{
				echo("размер шапки = 0, ошибка!");
				exit();
			}	
			echo("<tr align='center'><th colspan='".sizeof($zagol)."'><h1>".$zagol[0]."</h1></th></tr>\n");
			next($zagol);
			$previous=1;//определяет, когда закрывать <tr>
			$firsttime=0;
			foreach ($otkuda as $value)
			{
				//$otkuda - управляющий массив. 1 - имя, 2 - инпут, 0 - сл. строка, -1 - конец строки
				if (($previous!=0)&&($firsttime==1)&&($value==0)) 
				{
					echo ("</tr>\N");					
				}
				switch ($value)
				{
					case 0:
						echo('<tr>');
						$previous=0;
						$firsttime=1;
						break;
					case 1:
				   		echo("<td>".current($zagol)."</td>\n");
						$previous=1;
						$firsttime=1;						
						next($zagol);
						break;
					case 2:
						echo('<td>'.$this->draw_input(current($inparr)).'</td>');
						$previous=2;
						$firsttime=1;						
						next($inparr);						
						break;
					default:
						echo ("Параметр $value не поддерживается функцией shapka");
						break;					
				}
			}
			echo("</table>\n");
		}
        function draw_input($inparr1)
        {
			if (gettype($inparr1)!="object") 
			{
				echo ("<font color='red'>Нарушение целостности (аргумент $inparr1 имеет неравное число полей. проверьте соответствие количества полей для ввода шаблону</font>");
				exit();
			}
			$st="";
			if ($inparr1->style=="readonly") $st="style='background-color:#66FFCC'";
       
        	if ($inparr1->type=="text")
  	        	return ("<input name='".$inparr1->name."' type='".$inparr1->type."' value='".$inparr1->value."' size='".$inparr1->size."' ".$st." readonly='".$inparr1->ronly."'/>\n");
            
        }
		function draw_table($mytable, $artik, $maintransl)
		{
			echo('<br><hr></hr><br>');
			echo('<span id="table">');
			echo('<table border="1">');
			echo('<tr>');
			foreach ($mytable as $curelement)
	    	{
				echo('<td>'.$maintransl->translate($curelement->fieldheadname).'</td>');
			}
			echo('<td><a href="#" onclick="return addline();">'.$maintransl->translate("Добавить").'</td></tr>');
			echo('<tr id="newline" nomer="[0]">');
			foreach ($mytable as $curfield)
			{
				if ($curfield->fieldtype=="combined")
				{
					echo('<td><select name="'.$curfield->fieldname.'[0]" onchange="redraw_universal("'.$curfield->fieldname.', '.$curfield->fieldlinkto.')">');
					$i=1;
					echo('<option value=""> </option>');
					while ($element=each($artik))
					{
						if ($curfield->fieldtoshow=="nom") echo('<option value="'.$element[1]->nom.'">'.$element[1]->nom.'</option>');
						if ($curfield->fieldtoshow=="value") 
						{
							if ($maintransl->default_language=="RUS")
							{
								echo('<option value="'.$element[1]->nom.'">'.$element[1]->rus.'</option>');						
							} 
							elseif ($maintransl->default_language=="DE")
							{
								echo('<option value="'.$element[1]->nom.'">'.$element[1]->de.'</option>');														
							}
							else 
							{
							//	echo("проблема с переводом селектов в drawtable()");
							}
						}
					}
        			echo('</select></td>');
				}
				elseif ($curfield->fieldtype=="inputfield")
				{
					$inparr2=new input_type_select;
					$inparr2->name=$curfield->inptblname;
					$inparr2->type="text";	
					$inparr2->value=$curfield->inptblname;
					$inparr2->style=$curfield->inptblstyle;
					$inparr2->ronly=$curfield->inptblronly;
					$inparr2->size=$curfield->inptblsize;
					echo ("<td>".$this->draw_input($inparr2)."</td>");
				}
				else 
				{
					echo("проблема вызова DrawTable объекта - нет соответствующего значения fieldtype для ".$curfield->fieldtype);
					exit();
				}
        }		
		echo ('<td valign="top"><a href="#" onclick="return rmline(0);"/>'.$maintransl->translate("Удалить").'</td>');
		echo('</tr>');
		echo('</table>');
	}
}
    class input_type_select
    {
    	var $name;
		var $type;
		var $value;
        var $style;
		var $ronly;
		var $size;
        function draw()
        {
        	
        }
    }
    class mytbl //класс для описания параметров таблицы ввода
    {
    	var $fieldheadname;//название колонки
        var $fieldname;//внутреннее имя поля
        var $fieldlinkto;//ссылка на внутреннее имя комбинированных селектов
        var $fieldtype;//тип поля - combined (комбинированный селект), inputfield (обычный инпут), selectfield (обычный селект)
        var $inptblname;
		var $inptbltype;
		var $inptblvalue;
        var $inptblstyle;
		var $inptblronly;
		var $inptblsize;		
    }
?>